package org.niux.aims.action.ajax;

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.Resource;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.niux.aims.common.web.AimsBaseAction;
import org.niux.aims.models.Entitys;
import org.niux.aims.service.IEntitysService;
import org.niux.aims.vo.ApplicationVO;
import org.niux.aims.vo.EntityTypeVO;
import org.niux.aims.vo.EntityVO;

/**
 * 
 * Copyright (c) 2009,niux<br>
 * All rights reserved.<br>
 * 
 * 文件名称：GetEntitysAjax.java<br>
 * 摘 要：获取实体数据AJAX类<br>
 * <br>
 * 当前版本：<br>
 * 作 者：铭显 Email: <a
 * href="mailto:liangmingxian@gmail.com">liangmingxian@gmail.com</a><br>
 * 完成日期：@since 2013-8-6<br>
 * <br>
 * 取代版本：<br>
 * 原作者 ：<br>
 * 完成日期：@since Oct 22, 2009<br>
 */
public class GetEntitysAjax extends AimsBaseAction {

	/**
	 * 
	 */
	private static final long serialVersionUID = 3573768334495179108L;

	private Log log = LogFactory.getLog(this.getClass());
	private int page;
	private int pageSize;
	private String search;
	private int appid;
	private List<EntityVO> entitys;

	@Resource(name = "entityService")
	private IEntitysService entityService;

	public GetEntitysAjax() {
		this.entitys = new ArrayList<EntityVO>();
	}

	/**
	 * 
	 * 方法概述：分页获取实体数据 描述：分页获取实体数据
	 * 
	 * @return 返回类型：String 修改人：梁铭显 修改时间：2013-8-6
	 * @throws UnsupportedEncodingException
	 */
	public String getEntitysByPage() throws UnsupportedEncodingException {
		log.debug(page + "====" + pageSize + "====" + search);
		log.debug(entitys.size());
		entitys.clear();
		log.debug(entitys.size());

		int startPage = page * pageSize;

		List<Entitys> allEntitys = new ArrayList<Entitys>();

		if (search == null) {
			allEntitys = entityService.findAll();
		} else {
			allEntitys = entityService.findByEntityName(URLDecoder.decode(
					search, "UTF-8"));
		}

		int num = 0;
		int count = 0;

		// MENU实体
		for (Entitys entity : allEntitys) {
			if (entity.getEntitys() == null) {
				if (num >= startPage && count < pageSize) {
					EntityVO menu = transformToVo(entity);
					entitys.add(menu);
					count++;
				}
				num++;
			}
		}

		// PAGE实体
		for (EntityVO menu : entitys) {
			List<EntityVO> pages = new ArrayList<EntityVO>();

			for (Entitys entity : allEntitys) {
				if (entity.getEntitys() != null
						&& entity.getEntitys().getId() == Integer.parseInt(menu
								.getId())) {
					EntityVO page = transformToVo(entity);
					pages.add(page);
				}
			}
			menu.setChild(pages);
		}

		// BUTTON实体
		for (EntityVO menu : entitys) {
			if (!menu.getChild().isEmpty()) {
				for (EntityVO page : menu.getChild()) {
					List<EntityVO> buttons = new ArrayList<EntityVO>();

					for (Entitys entity : allEntitys) {
						if (entity.getEntitys() != null
								&& entity.getEntitys().getId() == Integer
										.parseInt(page.getId())) {
							EntityVO button = transformToVo(entity);
							buttons.add(button);
						}
					}

					page.setChild(buttons);
				}
			}
		}

		for (EntityVO e : entitys) {
			log.debug("==" + e.getEntityName());

			for (EntityVO c : e.getChild()) {
				log.debug("===" + c.getEntityName());

				for (EntityVO b : c.getChild()) {
					log.debug("====" + b.getEntityName());
				}
			}
		}

		return SUCCESS;
	}

	/**
	 * 
	 * 方法概述：根据应用ID获取应用实体列表
	 * 描述：根据应用ID获取应用实体列表
	 * @return
	 * 返回类型：String
	 * 修改人：梁铭显 
	 * 修改时间：2013-11-22
	 */
	public String getEntitiesByApp() {
		log.debug("===============" + appid);
		List<Entitys> allEntitys = entityService.findAll();

		// MENU实体
		for (Entitys entity : allEntitys) {
			if (entity.getEntitys() == null && entity.getApplication().getId() == appid) {
				EntityVO menu = transformToVo(entity);
				entitys.add(menu);
			}
		}

		// PAGE实体
		for (EntityVO menu : entitys) {
			List<EntityVO> pages = new ArrayList<EntityVO>();

			for (Entitys entity : allEntitys) {
				if (entity.getEntitys() != null
						&& entity.getEntitys().getId() == Integer.parseInt(menu
								.getId())) {
					EntityVO page = transformToVo(entity);
					pages.add(page);
				}
			}
			menu.setChild(pages);
		}

		// BUTTON实体
		for (EntityVO menu : entitys) {
			if (!menu.getChild().isEmpty()) {
				for (EntityVO page : menu.getChild()) {
					List<EntityVO> buttons = new ArrayList<EntityVO>();

					for (Entitys entity : allEntitys) {
						if (entity.getEntitys() != null
								&& entity.getEntitys().getId() == Integer
										.parseInt(page.getId())) {
							EntityVO button = transformToVo(entity);
							buttons.add(button);
						}
					}

					page.setChild(buttons);
				}
			}
		}

		return SUCCESS;
	}

	/**
	 * 
	 * 方法概述：DO转换成VO 描述：DO转换成VO
	 * 
	 * @param entity
	 * @return 返回类型：EntityVO 修改人：梁铭显 修改时间：2013-8-25
	 */
	public EntityVO transformToVo(Entitys entity) {
		EntityVO entityVo = new EntityVO();
		entityVo.setId(Integer.toString(entity.getId()));
		entityVo.setEntityName(entity.getEntityName());
		entityVo.setEntityCode(entity.getEntityCode());

		ApplicationVO appVo = new ApplicationVO();
		appVo.setId(entity.getApplication().getId());
		appVo.setAppName(entity.getApplication().getAppName());

		entityVo.setAppVo(appVo);

		EntityTypeVO entityTypeVo = new EntityTypeVO();
		entityTypeVo.setId(entity.getEntityType().getId());
		entityTypeVo.setEntityTypeName(entity.getEntityType().getEntityType());

		entityVo.setEntityTypeVo(entityTypeVo);

		return entityVo;
	}

	public int getPage() {
		return page;
	}

	public void setPage(int page) {
		this.page = page;
	}

	public int getPageSize() {
		return pageSize;
	}

	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}

	public List<EntityVO> getEntitys() {
		return entitys;
	}

	public void setEntitys(List<EntityVO> entitys) {
		this.entitys = entitys;
	}

	public String getSearch() {
		return search;
	}

	public void setSearch(String search) {
		this.search = search;
	}

	public int getAppid() {
		return appid;
	}

	public void setAppid(int appid) {
		this.appid = appid;
	}

}
